package cn.gl.basic.service.impl;

import cn.gl.basic.dto.EmailCodeDto;
import cn.gl.basic.dto.PhoneCodeDto;
import cn.gl.basic.exception.BusinessException;
import cn.gl.basic.service.IVerifyCodeService;
import cn.gl.basic.util.StrUtils;
import cn.gl.basic.util.VerifyCodeUtils;
import cn.gl.org.domain.Employee;
import cn.gl.org.domain.Shop;
import cn.gl.org.mapper.ShopAuditLogMapper;
import cn.gl.usr.domain.User;
import cn.gl.usr.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;
@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private JavaMailSender javaMailSender;
    @Autowired
    private UserMapper userMapper;
    @Override
    public String getImageCode(String key) {
        //1.获取图形验证码
        String code = StrUtils.getComplexRandomString(4);
        //2.保存到redis：【key：code - 5】
        redisTemplate.opsForValue().set(key,code,5, TimeUnit.MINUTES);
        //3.将图形验证码写入图片编码成base64的字符串
        return VerifyCodeUtils.verifyCode(115,40,code);

    }

    @Override
    public void getPhoneCode(PhoneCodeDto phoneCodeDto) {
        //校验空值
        if(StringUtils.isEmpty(phoneCodeDto.getImageCode())||StringUtils.isEmpty(phoneCodeDto.getPhone())){
            throw new BusinessException("信息不能为空");
        }
        //2.校验手机号码是否注册过
        User user= userMapper.laodByPhone(phoneCodeDto.getPhone());
        if (user!=null){
            throw new BusinessException("当前号码已注册，请直接登录");
        }
        //3.图形验证码是否过期
        Object obj = redisTemplate.opsForValue().get(phoneCodeDto.getImageCodeKey());
        if (obj == null){
            throw new BusinessException("验证码已过期，请重新发送");
        }
        //校验验证码与redis缓存是否一致
        if (!phoneCodeDto.getImageCode().equalsIgnoreCase(obj.toString())){
            throw new BusinessException("输入验证码不一致，请重新输入");
        }
        //二 获取手机验证码
        //通过key从redis获得手机短信验证码
        Object phoneCodeObj = redisTemplate.opsForValue().get("register:" + phoneCodeDto.getPhone());
        System.out.println(phoneCodeObj);
        //判断验证码是否为空
        String phoneCode = null;
        if (phoneCodeObj == null){
            //为空 第一次发送 或者收件验证码过期了- 重新生成一个
             phoneCode = StrUtils.getRandomString(4);
        }else {
            //不为空=手机验证码没有过期。判断是否过了重发时间
            long now = System.currentTimeMillis();
            long old = Long.parseLong(phoneCodeObj.toString().split(":")[1]);
            if ((now - old)<1*60*10000){
                //没有过重发时间=违规操作【抛业务异常】
                throw new BusinessException("请勿重发送验证码");
            }else {
                //过了重发时间=可以重新发送【用没有郭过期的验证码】
                phoneCode = phoneCodeObj.toString().split(":")[0];

            }
        }
        //3.刷新过期时间 = 重新添加一次数据到redis
        redisTemplate.opsForValue().set("register:" + phoneCodeDto.getPhone()
                ,phoneCode+":"+System.currentTimeMillis(),
                3,TimeUnit.MINUTES);
        //三：调用第三方接口发送短信验证码：调用工具类
        //SmsUtils.sendSms(dto.getPhone(),"你的手机验证码是：" + phoneCode+",请在3分钟内使用!!!");
        System.out.println("你的手机验证码是：" + phoneCode+",请在3分钟内使用!!!");

    }

    @Override
    public void getemailCode(EmailCodeDto emailCodeDto) {
        //校验空值
        if(StringUtils.isEmpty(emailCodeDto.getEmail())){
            throw new BusinessException("信息不能为空");
        }
        //2.校验邮箱是否注册过
        User user= userMapper.laodByEmail(emailCodeDto.getEmail());
        if (user!=null){
            throw new BusinessException("当前邮箱已注册，请直接登录");
        }
        //二 获取邮箱验证码
        //通过key从redis获得邮箱短信验证码
        Object emailCodeObj = redisTemplate.opsForValue().get("register:" + emailCodeDto.getEmailCode());
        //判断验证码是否为空
        String emailCode = null;
        if (emailCodeObj == null){
            //为空 第一次发送 或者收件验证码过期了- 重新生成一个
            emailCode = StrUtils.getRandomString(4);
        }else {
            //不为空=手机验证码没有过期。判断是否过了重发时间
            long now = System.currentTimeMillis();
            long old = Long.parseLong(emailCodeObj.toString().split(":")[1]);
            if ((now - old)<1*60*10000){
                //没有过重发时间=违规操作【抛业务异常】
                throw new BusinessException("请勿重发送验证码");
            }else {
                //过了重发时间=可以重新发送【用没有郭过期的验证码】
                emailCode = emailCodeObj.toString().split(":")[0];

            }
        }
        //3.刷新过期时间 = 重新添加一次数据到redis
        redisTemplate.opsForValue().set("register:" + emailCodeDto.getEmail()
                ,emailCode+":"+System.currentTimeMillis(),
                3,TimeUnit.MINUTES);
        //三：调用第三方接口发送短信验证码：调用工具类
        //SmsUtils.sendSms(dto.getPhone(),"你的手机验证码是：" + phoneCode+",请在3分钟内使用!!!");
        /*System.out.println("你的手机验证码是：" + phoneCode+",请在3分钟内使用!!!");*/
        //3.发邮件给店长通知他重新修改信息入驻
        SimpleMailMessage message = new SimpleMailMessage();

        message.setFrom("1578203936@qq.com");
        message.setSubject("邮箱验证码");
        //true-能够在内容组编写html标签 会解析
        message.setText("你的邮箱验证码是：" + emailCode+",请在3分钟内使用!!!");
        //收件人
        message.setTo(emailCodeDto.getEmail());//邮件地址
        javaMailSender.send(message);

    }

    @Override
    public void getBinderSmsCode(PhoneCodeDto phoneCodeDto) {
        //一：校验
        //1.校验空值
        if(StringUtils.isEmpty(phoneCodeDto.getPhone())){
            throw new BusinessException("手机号不能为空!!!");
        }

        //二：获取手机短信验证码：【业务键:电话号码 - 手机验证码:时间戳】
        //1.通过key从redis获取手机短信验证码
        Object phoneCodeObj = redisTemplate.opsForValue().get("binder:" + phoneCodeDto.getPhone());
        //2.判断是否为null
        String phoneCode = null;
        if(phoneCodeObj == null){
            //2.1.为空 = 第一次发送或手机验证码过期了 => 重新生成一个
            phoneCode = StrUtils.getRandomString(4);
        }else{
            //2.2.不为空 = 手机验证码没有过期。判断是否过了重发时间
            long now = System.currentTimeMillis();
            long old = Long.parseLong(phoneCodeObj.toString().split(":")[1]);
            if((now - old)<1*60*1000){
                //2.2.1.没有过重发时间 = 违规操作【抛业务异常】
                throw new BusinessException("请勿重复发送验证码!!!");
            }else{
                //2.2.2.过了重发时间 = 可以重新发送【用没有过期的那个验证码】
                phoneCode = phoneCodeObj.toString().split(":")[0];
            }
        }
        //3.刷新过期时间 = 重新添加一次数据到redis
        redisTemplate.opsForValue().set("binder:"+phoneCodeDto.getPhone()
                ,phoneCode+":"+System.currentTimeMillis(),3,TimeUnit.MINUTES);
        //三：调用第三方接口发送短信验证码：调用工具类
        //SmsUtils.sendSms(dto.getPhone(),"你的手机验证码是：" + phoneCode+",请在3分钟内使用!!!");
        System.out.println("你的手机验证码是：" + phoneCode+",请在3分钟内使用!!!");
    }
}
